← 返回列表
main - 副本 (5).py
📅 创建:2026-11-02 11:15:54
✏️ 修改:2026-11-02 11:03:38
📦 大小:2868 字节
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from pathlib import Path
import os
from datetime import datetime
app = FastAPI(title="My Notes 浏览器")
# 模板目录
templates = Jinja2Templates(directory="templates")
# my_notes 目录(与 main.py 同级)
NOTES_DIR = Path(__file__).parent / "my_notes"
NOTES_DIR.mkdir(exist_ok=True) # 如果不存在自动创建
def get_python_files():
"""获取 my_notes 目录下所有 python 文件信息"""
files = []
for f in NOTES_DIR.iterdir():
if f.is_file() and f.suffix.lower() == ".py":
stat = f.stat()
# Windows 上 st_ctime 是创建时间
created = datetime.fromtimestamp(stat.st_ctime).strftime("%Y-%m-%d %H:%M:%S")
files.append({
"name": f.name,
"created": created,
"size": stat.st_size,
})
# 按创建时间倒序排列
files.sort(key=lambda x: x["created"], reverse=True)
return files
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
"""主页:双列显示文件名和创建时间"""
files = get_python_files()
return templates.TemplateResponse(
"index.html",
{"request": request, "files": files, "dir": str(NOTES_DIR)}
)
@app.get("/view/{filename}", response_class=HTMLResponse)
async def view_file(request: Request, filename: str):
"""查看文件源码"""
# 安全校验:防止路径穿越
if "/" in filename or "\\" in filename or ".." in filename:
raise HTTPException(status_code=400, detail="非法文件名")
file_path = NOTES_DIR / filename
if not file_path.exists() or not file_path.is_file():
raise HTTPException(status_code=404, detail="文件不存在")
if file_path.suffix.lower() != ".py":
raise HTTPException(status_code=400, detail="只支持 .py 文件")
# 读取源码(尽量兼容各种编码)
try:
content = file_path.read_text(encoding="utf-8")
except UnicodeDecodeError:
content = file_path.read_text(encoding="gbk", errors="replace")
stat = file_path.stat()
created = datetime.fromtimestamp(stat.st_ctime).strftime("%Y-%m-%d %H:%M:%S")
modified = datetime.fromtimestamp(stat.st_mtime).strftime("%Y-%m-%d %H:%M:%S")
return templates.TemplateResponse(
"view_file.html",
{
"request": request,
"filename": filename,
"content": content,
"created": created,
"modified": modified,
"size": stat.st_size,
}
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=80)